Telegram Group & Telegram Channel
🐍 Задача с подвохом для продвинутых Python-разработчиков

🔹 Уровень: Advanced
🔹 Темы: особенности defaultdict, побочные эффекты, mutability, ловушки с list и dict

📌 Условие

Рассмотрим следующий код:


from collections import defaultdict

def make_dict():
return {"count": 0}

d = defaultdict(make_dict)

d["a"]["count"] += 1
d["b"]["count"] += 1
d["a"]["count"] += 1

print(d)


Вопросы

1. Что будет выведено на экран?
2. Почему результат может оказаться неожиданным при использовании других вариантов реализации?
3. Что изменится, если использовать make_dict() без функции-обёртки?

🔍 Разбор

Ожидаемый вывод:

defaultdict(<function make_dict at 0x...>, {'a': {'count': 2}, 'b': {'count': 1}})


🔧 Почему так происходит

- defaultdict вызывает make_dict() каждый раз, когда ключа нет в словаре.
- Для каждого нового ключа (`"a"` и "b"`) создаётся **новый** словарь `{"count": 0}.
- d["a"]["count"] += 1 увеличивает значение "count" у собственного словаря a.

⚠️ Подвох

Если бы вместо make_dict использовали один и тот же объект (например, через `lambda: some_dict`), то все ключи ссылались бы на один и тот же словарь — и значения начали бы "перетекать" между ключами:


shared = {"count": 0}
d = defaultdict(lambda: shared)


Тогда итог мог бы быть таким:

{'a': {'count': 2}, 'b': {'count': 2}} # неожиданно!


🧠 Вывод

- Никогда не используйте изменяемый объект напрямую как значение по умолчанию в defaultdict.
- Используй функции-фабрики, чтобы избежать общих ссылок между элементами.
- Проверяй поведение при работе со сложными структурами (`list`, `dict`) в качестве значений по умолчанию.


# Правильно:
defaultdict(lambda: {"count": 0})

# Ошибочно:
defaultdict(lambda: some_shared_dict)


📌 Используй copy.deepcopy() или фабричные функции, если создаёшь вложенные структуры.



tg-me.com/pro_python_code/1809
Create:
Last Update:

🐍 Задача с подвохом для продвинутых Python-разработчиков

🔹 Уровень: Advanced
🔹 Темы: особенности defaultdict, побочные эффекты, mutability, ловушки с list и dict

📌 Условие

Рассмотрим следующий код:


from collections import defaultdict

def make_dict():
return {"count": 0}

d = defaultdict(make_dict)

d["a"]["count"] += 1
d["b"]["count"] += 1
d["a"]["count"] += 1

print(d)


Вопросы

1. Что будет выведено на экран?
2. Почему результат может оказаться неожиданным при использовании других вариантов реализации?
3. Что изменится, если использовать make_dict() без функции-обёртки?

🔍 Разбор

Ожидаемый вывод:

defaultdict(<function make_dict at 0x...>, {'a': {'count': 2}, 'b': {'count': 1}})


🔧 Почему так происходит

- defaultdict вызывает make_dict() каждый раз, когда ключа нет в словаре.
- Для каждого нового ключа (`"a"` и "b"`) создаётся **новый** словарь `{"count": 0}.
- d["a"]["count"] += 1 увеличивает значение "count" у собственного словаря a.

⚠️ Подвох

Если бы вместо make_dict использовали один и тот же объект (например, через `lambda: some_dict`), то все ключи ссылались бы на один и тот же словарь — и значения начали бы "перетекать" между ключами:


shared = {"count": 0}
d = defaultdict(lambda: shared)


Тогда итог мог бы быть таким:

{'a': {'count': 2}, 'b': {'count': 2}} # неожиданно!


🧠 Вывод

- Никогда не используйте изменяемый объект напрямую как значение по умолчанию в defaultdict.
- Используй функции-фабрики, чтобы избежать общих ссылок между элементами.
- Проверяй поведение при работе со сложными структурами (`list`, `dict`) в качестве значений по умолчанию.


# Правильно:
defaultdict(lambda: {"count": 0})

# Ошибочно:
defaultdict(lambda: some_shared_dict)


📌 Используй copy.deepcopy() или фабричные функции, если создаёшь вложенные структуры.

BY Python RU


Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283

Share with your friend now:
tg-me.com/pro_python_code/1809

View MORE
Open in Telegram


Python RU Telegram | DID YOU KNOW?

Date: |

Traders also expressed uncertainty about the situation with China Evergrande, as the indebted property company has not provided clarification about a key interest payment.In economic news, the Commerce Department reported an unexpected increase in U.S. new home sales in August.Crude oil prices climbed Friday and front-month WTI oil futures contracts saw gains for a fifth straight week amid tighter supplies. West Texas Intermediate Crude oil futures for November rose $0.68 or 0.9 percent at 73.98 a barrel. WTI Crude futures gained 2.8 percent for the week.

Find Channels On Telegram?

Telegram is an aspiring new messaging app that’s taking the world by storm. The app is free, fast, and claims to be one of the safest messengers around. It allows people to connect easily, without any boundaries.You can use channels on Telegram, which are similar to Facebook pages. If you’re wondering how to find channels on Telegram, you’re in the right place. Keep reading and you’ll find out how. Also, you’ll learn more about channels, creating channels yourself, and the difference between private and public Telegram channels.

Python RU from ca


Telegram Python RU
FROM USA